#ifndef XUTIL_H
#define XUTIL_H

#ifndef NULL
#ifdef __cplusplus
#ifndef _WIN64
#define NULL 0
#else
#define NULL 0LL
#endif /* _WIN64 */
#else
#define NULL ((void *)0)
#endif /* __cplusplus */
#endif

////////////////////
// 数据类型定义
////////////////////

// int
// signed int: 标准有符号整数类型，通常占用 4 字节，取值范围约 -21 亿 ~ 21 亿，具体取决于编译器和平台
typedef signed int INT;
// unsigned int: 无符号整数类型，与 signed int 占用相同字节数，取值范围 0 ~ 42 亿左右
typedef unsigned int UINT;
// short
// signed short: 标准有符号短整数类型，通常占用 2 字节（16 位），取值范围为 -32768 ~ 32767，具体取决于编译器实现
typedef signed short SHORT;
// unsigned short: 无符号短整数类型，与 signed short 占用相同的 2 字节，但取值范围为 0 ~ 65535，无负数
typedef unsigned short USHORT;
// WORD: “字”，计算机体系结构中的经典术语，通常指 16 位二进制数据单元，用于描述“16 位无符号数据”
typedef unsigned short WORD;
// long
// long: 标准有符号长整数类型，通常占用 4 字节（32 位），取值范围约 -2^31 ~ 2^31-1（-2147483648 ~ 2147483647），
// 具体字节数可能因编译器和平台（如 32 位/64 位系统）略有差异）。
typedef long LONG;
// unsigned long: 无符号长整数类型，与 long 占用相同字节数，取值范围为 0 ~ 2^32-1（0 ~ 4294967295），无负数
typedef unsigned long ULONG;
// long long: 标准有符号长长整数类型，固定为 8 字节（64 位），
// 取值范围为 -2^63 ~ 2^63-1（-9223372036854775808 ~ 9223372036854775807），跨平台一致性高于 long。
typedef long long LLONG;
// float
typedef float FLOAT;
// double
typedef double DOUBLE;
// char
// signed char: 占用1字节（8位），取值范围为-128~127（取决于编译器实现）
typedef signed char CHAR;
// unsigned char: 占用1字节，取值范围为0~255（无负数）
typedef unsigned char UCHAR;
// BYTE: BYTE（字节）是计算机存储的基本单位，通常定义为8位二进制数据。
// unsigned char在C语言中天然符合“1字节无符号数据”的特性（标准规定char至少为8位）。
// 使用BYTE作为别名更直观地表示“字节”概念，常用于底层编程（如内存操作、数据传输）中
// 描述原始二进制数据单元，比直接使用unsigned char更具语义化。
typedef unsigned char BYTE;

// void pointer
typedef void *LPVOID;

////////////////////
// 高级类型定义
////////////////////

#ifndef TRUE
#define TRUE 1
#endif

#ifndef FALSE
#define FALSE 0
#endif

////////////////////
// 内存方法
////////////////////

#ifndef MALLOC
#define MALLOC(num, type) (type *)malloc(num * sizeof(type))
#endif

#ifndef FREE
#define FREE(ptr) free(ptr)
#endif

#ifndef ZERO_MEM
#define ZERO_MEM(ptr, size) memset(ptr, 0, size)
#endif

#ifndef COPY_MEM
#define COPY_MEM(dst, src, size) memcpy(dst, src, size)
#endif

////////////////////
// xxx
////////////////////

#endif
